package controller

import (
	"fmt"
	"net/http"
	"time"

	"gin-zc/config"
	"gin-zc/service"
	"gin-zc/util"

	"github.com/gin-gonic/gin"
	//"go.uber.org/zap"
)

type UserController struct {
	BaseController
	userService *service.UserService
}

var userService = &service.UserService{}

// Register 注册接口
func Register(c *gin.Context) {
	var req RegisterRequest
	// 参数绑定与验证
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, Error(400, "invalid parameters: "+err.Error()))
		return
	}

	// 调用业务逻辑
	user, err := userService.Register(req.Username, req.Email, req.Password)
	if err != nil {
		// 用户名/邮箱已存在返回409 Conflict
		c.JSON(http.StatusConflict, Error(409, err.Error()))
		return
	}

	// 返回用户信息（不含密码）
	c.JSON(http.StatusOK, Success(gin.H{
		"user_id":     user.ID,
		"username":    user.UserName,
		"phone":       user.Phone,
		"create_time": user.CreateTime,
	}))
}

// Login 登录接口
func Login(c *gin.Context) {
	var req LoginRequest
	// 请求参数校验
	if err := c.ShouldBindJSON(&req); err != nil {
		util.ValidateParam(c, err)
	}

	// 调用业务逻辑
	user, err := userService.Login(req.Phone, req.Password)
	if err != nil {
		// 用户名或密码错误返回401 Unauthorized
		c.JSON(http.StatusUnauthorized, Error(401, err.Error()))
		return
	}

	// 生成JWT令牌
	cfg := c.MustGet("config").(*config.Config) // 从上下文获取配置
	token, err := util.GenerateToken(user.ID, user.UserName, cfg)
	if err != nil {
		c.JSON(http.StatusInternalServerError, Error(500, "generate token failed"))
		return
	}

	// 返回令牌和用户信息
	c.JSON(http.StatusOK, Success(gin.H{
		"token":     token,
		"user_id":   user.ID,
		"username":  user.UserName,
		"expire_at": time.Now().Add(time.Duration(cfg.JWTExpire) * time.Second).Unix(),
	}))
}

// GetUserInfo 获取个人信息接口（需认证）
func GetUserInfo(c *gin.Context) {
	// 从中间件获取用户ID（已通过认证）
	userID := c.MustGet("user_id").(string)

	// 查询用户信息
	user, err := userService.GetUserByID(userID)
	if err != nil {
		c.JSON(http.StatusNotFound, Error(404, err.Error()))
		return
	}

	// 返回用户信息（过滤密码）
	c.JSON(http.StatusOK, Success(gin.H{
		"id":          user.ID,
		"username":    user.UserName,
		"phone":       user.Phone,
		"avatar":      user.Avatar,
		"create_time": user.CreateTime,
	}))
}

// controller/user_controller.go
func GetUser(c *gin.Context) {
	userID := c.Param("id")    // 假设从路径参数获取ID
	ctx := c.Request.Context() // 从请求中获取带log_id的context
	// 验证：从context中提取log_id（调试用）
	logID, ok := ctx.Value("log_id").(string)
	err := service.SetString("log_id", logID, 5*time.Minute)
	if err != nil {
		return
	}
	if !ok {
		fmt.Println("控制器中未获取到log_id")
	} else {
		fmt.Printf("控制器传递log_id: %s\n", logID)
	}
	redisLogId, _ := service.GetString("log_id")
	fmt.Println("redis中存储的logId值:" + redisLogId)
	//user, err := userService.GetUser(ctx, userID)
	//user, err := userService.GetUserWithOrders(ctx, userID)
	// 2. 调用服务层获取DTO
	// 方式1：直接返回结果
	//user, err := uc.userService.GetUserByID(userID)
	uc := UserController{}
	userDTO, err := userService.GetUserDTO(ctx, userID)
	uc.HandleResult(c, userDTO, err)

	//userDTO, err := userService.GetUserDTO(ctx, userID)
	//if err != nil {
	//	// 记录错误日志（含log_id）
	//	util.Logger.Error(
	//		"获取用户失败",
	//		zap.String("log_id", c.MustGet("log_id").(string)),
	//		zap.String("user_id", userID),
	//		zap.Error(err),
	//	)
	//	c.JSON(500, gin.H{"code": 500, "msg": "获取用户失败"})
	//	return
	//}

	//c.JSON(200, gin.H{"code": 0, "data": userDTO})
}
